home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windows Game Programming for Dummies (2nd Edition)
/
WinGamProgFD.iso
/
mac
/
DirectX SDK
/
DXSDK
/
samples
/
Multimedia
/
DirectDraw
/
RefreshRate
/
refreshrate.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2001-10-31
|
28KB
|
771 lines
//-----------------------------------------------------------------------------
// File: RefreshRate.cpp
//
// Desc: This example demonstrates basic usage of the IDirectDraw7::StartRefreshRate
// and IDirectDraw7::EvaluateMode methods. Together, these methods allow an
// application to explore what display modes and refresh rates the monitor
// connected to this display device is able to display, through a manual
// user-controlled process. The application will present the UI that asks
// the user if the current mode under test is being displayed correctly by
// the monitor.
//
// Applications should use these methods when they are interested in using
// higher refresh rates.
//
// The basic idea is that DirectDraw will setup a list of modes to be tested
// (based on the list the app passed in), and then sequentially test them
// under application control. The app starts the test process, and then
// calls IDirectDraw7::EvaluateMode continuously. DirectDraw will take care
// of setting the modes. All the app has to do is SetCooperativeLevel
// beforehand, and then handle surface loss and drawing the UI that asks the
// user if they can see the current mode under test. DirectDraw returns
// enough information from IDirectDraw7::EvaluateMode to allow the app to
// know when to do these things, and when to stop testing. The app can pass
// a flag to IDirectDraw7::EvaluateMode if the user happened to say they
// could see the mode corretly, which will cause DirectDraw to mark the mode
// as good and move on. DirectDraw may also decide that time as run out and
// give up on a certain mode.
//
// DirectDraw uses information at its disposal from any automated means to
// make the testing process as short as possible, and applications only need
// to test modes they are interested in.
//
// Copyright (c) 1999-2001 Microsoft Corp. All rights reserved.
//-----------------------------------------------------------------------------
#define STRICT
#include <windows.h>
#include <basetsd.h>
#include <commdlg.h>
#include <initguid.h>
#include <ddraw.h>
#include "resource.h"
//-----------------------------------------------------------------------------
// Function-prototypes
//-----------------------------------------------------------------------------
INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam );
HRESULT GetDirectDrawDevices();
VOID OnInitDialog();
HRESULT ResetDeviceModes( DWORD dwDeviceIndex );
HRESULT UpdateModesListBox( DWORD dwDeviceIndex );
BOOL WINAPI DDEnumCallbackEx( GUID*, LPSTR, LPSTR, LPVOID, HMONITOR );
HRESULT WINAPI EnumModesCallback( LPDDSURFACEDESC pddsd, LPVOID pContext );
HRESULT WINAPI EnumAllModesCallback( LPDDSURFACEDESC2 pddsd, LPVOID pContext );
HRESULT OnRefreshRate();
HRESULT PerformDirectDrawRefreshRate( LPDIRECTDRAW7 pDD, SIZE* aTestModes,
DWORD dwTestModes );
//-----------------------------------------------------------------------------
// Defines, constants, and global variables
//-----------------------------------------------------------------------------
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
struct DDRAW_DEVICE_STRUCT
{
GUID guid;
CHAR strDescription[256];
CHAR strDriverName[64];
DWORD dwModeCount;
SIZE aModeSize[256];
};
HWND g_hDlg = NULL;
LPDIRECTDRAW g_pDD = NULL;
DDRAW_DEVICE_STRUCT g_aDevices[16];
DWORD g_dwDeviceCount;
//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Entry point for the application. Since we use a simple dialog for
// user interaction we don't need to pump messages.
//-----------------------------------------------------------------------------
INT APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine,
INT nCmdShow )
{
if( FAILED( GetDirectDrawDevices() ) )
return FALSE;
// Display the main dialog box.
DialogBox( hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc );
return TRUE;
}
//-----------------------------------------------------------------------------
// Name: MainDlgProc()
// Desc: Handles dialog messages
//-----------------------------------------------------------------------------
INT_PTR CALLBACK MainDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_INITDIALOG:
// Store HWND in global
g_hDlg = hDlg;
OnInitDialog();
break;
case WM_COMMAND:
switch( LOWORD(wParam) )
{
case IDCANCEL:
EndDialog( hDlg, IDCANCEL );
break;
case IDC_TEST:
if( FAILED( OnRefreshRate() ) )
{
MessageBox( g_hDlg, "Error doing starting mode test. "
"Sample will now exit.", "DirectDraw Sample",
MB_OK | MB_ICONERROR );
EndDialog( g_hDlg, IDABORT );
}
break;
case IDC_RESET:
HWND hWndDeviceList;
DWORD dwDeviceIndex;
// Get the currently selected DirectDraw device
hWndDeviceList = GetDlgItem( hDlg, IDC_DDRAW_DEVICE_LIST );
dwDeviceIndex = (DWORD)SendMessage( hWndDeviceList, LB_GETCURSEL, 0, 0 );
// Reset the modes for it
if( FAILED( ResetDeviceModes( dwDeviceIndex ) ) )
{
MessageBox( g_hDlg, "Error reset DirectDraw device. "
"Sample will now exit.", "DirectDraw Sample",
MB_OK | MB_ICONERROR );
EndDialog( g_hDlg, IDABORT );
}
break;
case IDC_DDRAW_DEVICE_LIST:
switch( HIWORD(wParam) )
{
case LBN_SELCHANGE:
// Get the currently selected DirectDraw device
DWORD dwDeviceIndex;
dwDeviceIndex = (DWORD)SendMessage( (HWND) lParam,
LB_GETCURSEL, 0, 0 );
// Update the list boxes using it
if( FAILED( UpdateModesListBox( dwDeviceIndex ) ) )
{
MessageBox( g_hDlg, "Error enumerating DirectDraw modes."
"Sample will now exit.", "DirectDraw Sample",
MB_OK | MB_ICONERROR );
EndDialog( g_hDlg, IDABORT );
}
break;
default:
return FALSE;
}
break;
default:
return FALSE; // Didn't handle message
}
break;
default:
return FALSE; // Didn't handle message
}
return TRUE; // Handled message
}
//-----------------------------------------------------------------------------
// Name: GetDirectDrawDevices()
// Desc: Retrieves all available DirectDraw devices and stores the information
// in g_aDevices[]
//-----------------------------------------------------------------------------
HRESULT GetDirectDrawDevices()
{
return DirectDrawEnumerateEx( DDEnumCallbackEx,
NULL,
DDENUM_ATTACHEDSECONDARYDEVICES |
DDENUM_DETACHEDSECONDARYDEVICES |
DDENUM_NONDISPLAYDEVICES );
}
//-----------------------------------------------------------------------------
// Name: DDEnumCallbackEx()
// Desc: Enumerates all available DirectDraw devices
//-----------------------------------------------------------------------------
BOOL WINAPI DDEnumCallbackEx( GUID* pGUID,
LPSTR strDriverDescription,
LPSTR strDriverName,
LPVOID pContext,
HMONITOR hm )
{
HRESULT hr;
LPDIRECTDRAW pDD = NULL;
// Create a DirectDraw device using the enumerated guid
hr = DirectDrawCreateEx( pGUID, (VOID**)&pDD, IID_IDirectDraw7, NULL );
if( SUCCEEDED(hr) )
{
if( pGUID )
{
// Add it to the global storage structure
g_aDevices[ g_dwDeviceCount ].guid = *pGUID;
}
else
{
// Clear the guid from the global storage structure
ZeroMemory( &g_aDevices[ g_dwDeviceCount ].guid,
sizeof(GUID) );
}
// Copy the description of the driver into the structure
lstrcpyn( g_aDevices[ g_dwDeviceCount ].strDescription,
strDriverDescription, 256 );
lstrcpyn( g_aDevices[ g_dwDeviceCount ].strDriverName,
strDriverName, 64 );
// Retrive the modes this device can support
g_aDevices[ g_dwDeviceCount ].dwModeCount = 0;
hr = pDD->EnumDisplayModes( 0, NULL, NULL, EnumModesCallback );
// Increase the counter for the number of devices found
g_dwDeviceCount++;
// Release this device
SAFE_RELEASE( pDD );
}
// Continue looking for more devices
return TRUE;
}
//-----------------------------------------------------------------------------
// Name: EnumModesCallback()
// Desc: Enumerates the available modes for the device from which
// EnumDisplayModes() was called. It records the unique mode sizes in
// the g_aDevices[g_dwDeviceCount].aModeSize array
//-----------------------------------------------------------------------------
HRESULT WINAPI EnumModesCallback( LPDDSURFACEDESC pddsd,
LPVOID pContext )
{
DWORD i;
DWORD dwModeSizeX;
DWORD dwModeSizeY;
DWORD dwModeCount;
// For each mode, look through all previously found modes
// to see if this mode has already been added to the list
dwModeCount = g_aDevices[ g_dwDeviceCount ].dwModeCount;
for( i = 0; i < dwModeCount; i ++ )
{
dwModeSizeX = g_aDevices[ g_dwDeviceCount ].aModeSize[i].cx;
dwModeSizeY = g_aDevices[ g_dwDeviceCount ].aModeSize[i].cy;
if ( ( dwModeSizeX == pddsd->dwWidth ) &&
( dwModeSizeY == pddsd->dwHeight ) )
{
// If this mode has been added, then stop looking
break;
}
}
// If this mode was not in g_aDevices[g_dwDeviceCount].aModeSize[]
// then added it.
if( i == g_aDevices[ g_dwDeviceCount ].dwModeCount )
{
g_aDevices[ g_dwDeviceCount ].aModeSize[i].cx = pddsd->dwWidth;
g_aDevices[ g_dwDeviceCount ].aModeSize[i].cy = pddsd->dwHeight;
// Increase the number of modes found for this device
g_aDevices[ g_dwDeviceCount ].dwModeCount++;
}
return TRUE;
}
//-----------------------------------------------------------------------------
// Name: OnInitDialog()
// Desc: Initializes the dialogs (sets up UI controls, etc.)
//-----------------------------------------------------------------------------
VOID OnInitDialog()
{
// Load the icon
#ifdef _WIN64
HINSTANCE hInst = (HINSTANCE) GetWindowLongPtr( g_hDlg, GWLP_HINSTANCE );
#else
HINSTANCE hInst = (HINSTANCE) GetWindowLong( g_hDlg, GWL_HINSTANCE );
#endif
HICON hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_ICON1 ) );
// Set the icon for this dialog.
PostMessage( g_hDlg, WM_SETICON, ICON_BIG, (LPARAM) hIcon ); // Set big icon
PostMessage( g_hDlg, WM_SETICON, ICON_SMALL, (LPARAM) hIcon ); // Set small icon
// Show all available DirectDraw devices in the listbox
HWND hWndDeviceList = GetDlgItem( g_hDlg, IDC_DDRAW_DEVICE_LIST );
for( UINT i = 0; i < g_dwDeviceCount; i++ )
{
SendMessage( hWndDeviceList, LB_ADDSTRING, 0,
(LPARAM) g_aDevices[i].strDescription );
SendMessage( hWndDeviceList, LB_SETITEMDATA, i, (LPARAM) i);
}
// Select the first device by default
DWORD dwCurrentSelect = 0;
SendMessage( hWndDeviceList, LB_SETCURSEL, dwCurrentSelect, 0);
if( FAILED( UpdateModesListBox( dwCurrentSelect ) ) )
{
MessageBox( g_hDlg, "Error enumerating DirectDraw modes."
"Sample will now exit.", "DirectDraw Sample",
MB_OK | MB_ICONERROR );
EndDialog( g_hDlg, IDABORT );
}
SetFocus( hWndDeviceList );
}
//-----------------------------------------------------------------------------
// Name: ResetDeviceModes()
// Desc: If the user makes a mistake, and accidently says YES when a mode
// cannot be seen, or NO when a mode really can be seen (thus ending up
// with a lower refresh rate than possible) this allows the user to reset
// the test results and try again.
//-----------------------------------------------------------------------------
HRESULT ResetDeviceModes( DWORD dwDeviceIndex )
{
LPDIRECTDRAW7 pDD = NULL;
HRESULT hr;
// Create a DirectDraw device based using the selected device guid
hr = DirectDrawCreateEx( &g_aDevices[dwDeviceIndex].guid,
(VOID**) &pDD, IID_IDirectDraw7, NULL);
if( SUCCEEDED(hr) )
{
// Set the cooperative level to normal
if( SUCCEEDED( hr = pDD->SetCooperativeLevel( g_hDlg, DDSCL_NORMAL ) ) )
{
// Clear the previous mode tests
//
// We ignore the return code, since we would do nothing different on error returns.
// Note that most applications would never need to call StartRefreshRate this way.
// The reset functionality is intended to be used when a user accidentally accepted
// a mode that didn't actually display correctly.
pDD->StartModeTest( NULL, 0, 0 );
}
// Release this device
SAFE_RELEASE( pDD );
}
hr = UpdateModesListBox( dwDeviceIndex );
return hr;
}
//-----------------------------------------------------------------------------
// Name: UpdateModesListBox()
// Desc: Updates the "modes to test" and "all modes" list boxes
//-----------------------------------------------------------------------------
HRESULT UpdateModesListBox( DWORD dwDeviceIndex )
{
LPDIRECTDRAW7 pDD = NULL;
HRESULT hr;
HWND hWndModesToTest = GetDlgItem( g_hDlg, IDC_TEST_MODES_LIST );
SendMessage( hWndModesToTest, LB_RESETCONTENT, 0, 0 );
// Update the "modes to test" list box based on the display device selected
for( DWORD i = 0; i < g_aDevices[dwDeviceIndex].dwModeCount; i++ )
{
CHAR strMode[64];
// Make a string based on the this mode's size
wsprintf( strMode, TEXT("%u x %u"),
g_aDevices[dwDeviceIndex].aModeSize[i].cx,
g_aDevices[dwDeviceIndex].aModeSize[i].cy );
// Add it to the list box
SendMessage( hWndModesToTest, LB_ADDSTRING, 0, (LPARAM) strMode );
SendMessage( hWndModesToTest, LB_SETITEMDATA, i, (LPARAM) i );
}
// Create a DirectDraw device based using the selected device guid
if( SUCCEEDED( hr = DirectDrawCreateEx( &g_aDevices[dwDeviceIndex].guid,
(VOID**) &pDD, IID_IDirectDraw7, NULL) ) )
{
HWND hWndAllModes = GetDlgItem( g_hDlg, IDC_ALL_MODES_LIST );
SendMessage( hWndAllModes, LB_RESETCONTENT, 0, 0 );
// Enumerate and display all supported modes along
// with supported bit depth, and refresh rates
// in the "All Modes" listbox
hr = pDD->EnumDisplayModes( DDEDM_REFRESHRATES, NULL,
(VOID*) hWndAllModes,
EnumAllModesCallback );
// Release this device
SAFE_RELEASE( pDD );
}
return hr;
}
//-----------------------------------------------------------------------------
// Name: EnumAllModesCallback()
// Desc: For each mode enumerated, it adds it to the "All Modes" listbox.
//-----------------------------------------------------------------------------
HRESULT WINAPI EnumAllModesCallback( LPDDSURFACEDESC2 pddsd,
LPVOID pContext )
{
CHAR strMode[64];
HWND hWnd = (HWND) pContext;
wsprintf( strMode, TEXT("%ux%ux%u - %u Hz"),
pddsd->dwWidth,
pddsd->dwHeight,
pddsd->ddpfPixelFormat.dwRGBBitCount,
pddsd->dwRefreshRate );
SendMessage( hWnd, LB_ADDSTRING, 0, (LPARAM) strMode );
return TRUE;
}
//-----------------------------------------------------------------------------
// Name: OnRefreshRate()
// Desc: User hit the "Test" button
//-----------------------------------------------------------------------------
HRESULT OnRefreshRate()
{
HWND hWndModesToTest = GetDlgItem( g_hDlg, IDC_TEST_MODES_LIST );
DWORD dwSelectCount = (DWORD)SendMessage( hWndModesToTest, LB_GETSELCOUNT, 0, 0 );
if( dwSelectCount > 0 )
{
LPDIRECTDRAW7 pDD = NULL;
HRESULT hr;
HWND hWndDeviceList;
DWORD dwDeviceIndex;
// Get the currently selected DirectDraw device
hWndDeviceList = GetDlgItem( g_hDlg, IDC_DDRAW_DEVICE_LIST );
dwDeviceIndex = (DWORD)SendMessage( hWndDeviceList, LB_GETCURSEL, 0, 0 );
// Create a DirectDraw device based using the selected device guid
if( FAILED( hr = DirectDrawCreateEx( &g_aDevices[dwDeviceIndex].guid,
(VOID**) &pDD, IID_IDirectDraw7, NULL) ) )
return hr;
// This is a good usage of DDSCL_CREATEDEVICEWINDOW: DirectDraw will create a window that covers
// the monitor, and won't mess around with our dialog box. Any mouse clicks on the cover window
// will therefore not be received and misinterpreted by the dialog box, since such clicks will
// be sent to DirectDraw's internal message procedure and therein ignored.
if( FAILED( hr = pDD->SetCooperativeLevel( g_hDlg,
DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN |
DDSCL_CREATEDEVICEWINDOW |
DDSCL_SETFOCUSWINDOW ) ) )
{
SAFE_RELEASE( pDD );
return hr;
}
SIZE aTestModes[256];
DWORD dwTestModes = 0;
// Find out which modes are selected, then just test those
for( DWORD i = 0; i < g_aDevices[dwDeviceIndex].dwModeCount; i++ )
{
if( SendMessage( hWndModesToTest, LB_GETSEL, i, 0 ) )
{
// Record the selected modes in aTestModes[]
aTestModes[dwTestModes] = g_aDevices[dwDeviceIndex].aModeSize[i];
dwTestModes++;
}
}
// Perform test on each of the selected modes on the selected device
hr = PerformDirectDrawRefreshRate( pDD, aTestModes, dwTestModes );
// Release this device
SAFE_RELEASE( pDD );
switch (hr)
{
case DDERR_NOMONITORINFORMATION:
// No EDID data is present for the current monitor.
MessageBox(g_hDlg,
"The current monitor cannot be identified electronically.\n"
"High refresh rates are not allowed on such monitors, so the test will not be performed.",
"Testing Will Not Proceed", MB_OK | MB_ICONINFORMATION);
break;
case DDERR_NODRIVERSUPPORT:
// The driver cannot support refresh rate testing.
MessageBox(g_hDlg,
"This driver does not support the refresh rate feature of DirectDraw. Test cannot be performed.",
"Testing Cannot Proceed", MB_OK | MB_ICONINFORMATION);
break;
default:
if( SUCCEEDED(hr) )
{
MessageBox( g_hDlg, TEXT("Mode test completed"), TEXT("Result"), MB_OK );
break;
}
else
{
// A StartRefreshRate error occurred.
MessageBox(g_hDlg,
"StartRefreshRate returned an unexpected value when called with the DDSMT_ISTESTREQUIRED flag.",
"StartRefreshRate Error", MB_OK | MB_ICONEXCLAMATION);
return hr;
}
}
// Update the mode list boxes based on the device selected
if( FAILED( hr = UpdateModesListBox( dwDeviceIndex ) ) )
return hr;
}
else
{
// There weren't any modes selected to test
MessageBox( g_hDlg,
TEXT("Select one or more modes to test from the list box"),
TEXT("No modes selected"), MB_OK );
}
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: SetupPrimarySurface()
// Desc: Setups a primary DirectDraw surface
//-----------------------------------------------------------------------------
HRESULT SetupPrimarySurface( LPDIRECTDRAW7 pDD, LPDIRECTDRAWSURFACE7* ppDDS )
{
DDSURFACEDESC2 ddsd;
ZeroMemory( &ddsd, sizeof(ddsd) );
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
return pDD->CreateSurface(&ddsd, ppDDS, NULL);
}
//-----------------------------------------------------------------------------
// Name: UpdatePrimarySurface()
// Desc: Fills the primary surface with white, and diplays the timeout value
// on screen
//-----------------------------------------------------------------------------
HRESULT UpdatePrimarySurface( LPDIRECTDRAWSURFACE7 pDDS, DWORD dwTimeout )
{
DDBLTFX ddbltfx;
HDC hDC;
char strTimeout[128];
RECT rect;
HRESULT hr;
// Clear the screen:
ZeroMemory( &ddbltfx, sizeof(ddbltfx) );
ddbltfx.dwSize = sizeof(ddbltfx);
ddbltfx.dwFillColor = 0xFFFFFFFF;
hr = pDDS->Blt( NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx );
if( FAILED( hr ) )
return hr;
// Display the timeout value
if( FAILED( hr = pDDS->GetDC( &hDC ) ) )
return hr;
GetWindowRect( g_hDlg, &rect );
wsprintf( strTimeout, TEXT("Press space to accept or escape to reject. ")
TEXT("%2d seconds until timeout"), dwTimeout );
DrawText( hDC, strTimeout, strlen(strTimeout), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
// Cleanup
pDDS->ReleaseDC( hDC );
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: PerformDirectDrawRefreshRate()
// Desc: Perform the IDirectDraw7::StartRefreshRate and IDirectDraw7::EvaluateMode
// tests
// Returns: S_OK if no modes needed testing, or all modes tested successfully,
// informative error code otherwise.
//-----------------------------------------------------------------------------
HRESULT PerformDirectDrawRefreshRate( LPDIRECTDRAW7 pDD, SIZE* aTestModes,
DWORD dwTestModes )
{
LPDIRECTDRAWSURFACE7 pDDSPrimary = NULL;
HRESULT hr;
MSG msg;
DWORD dwFlags = 0;
DWORD dwTimeout;
BOOL bMsgReady;
// First call StartRefreshRate with the DDSMT_ISTESTREQUIRED flag to determine
// whether the tests can be performed and need to be performed.
hr = pDD->StartModeTest( aTestModes, dwTestModes, DDSMT_ISTESTREQUIRED);
switch (hr)
{
case DDERR_NEWMODE:
// DDERR_NEWMODE means that there are modes that need testing.
break;
case DDERR_TESTFINISHED:
// DDERR_TESTFINISHED means that all the modes that we wish to test have already been tested correctly
return S_OK;
default:
//Possible return codes here include DDERR_NOMONITORINFORMATION or DDERR_NODRIVERSUPPORT or
//other fatal error codes (DDERR_INVALIDPARAMS, DDERR_NOEXCLUSIVEMODE, etc.)
return hr;
}
hr = pDD->StartModeTest( aTestModes, dwTestModes, 0 );
if( hr == DDERR_TESTFINISHED )
{
// The tests completed early, so return
return S_OK;
}
// Create the primary DirectDraw surface
if( FAILED( SetupPrimarySurface( pDD, &pDDSPrimary ) ) )
return hr;
// Loop until the mode tests are complete
while( TRUE )
{
bMsgReady = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
if( bMsgReady )
{
if (msg.message == WM_KEYDOWN)
{
switch (msg.wParam)
{
case VK_SPACE:
dwFlags = DDEM_MODEPASSED;
break;
case VK_ESCAPE:
dwFlags = DDEM_MODEFAILED;
break;
}
}
else
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
else
{
// This method will only succeed with monitors that contain EDID data.
// If the monitor is not EDID compliant, then the method will return
// DDERR_TESTFINISHED without testing any modes. If the EDID table does not
// contain values higher than 60hz, no modes will tested. Refresh rates
// higher than 100 hz will only be tested if the EDID table contains values
// higher than 85hz.
hr = pDD->EvaluateMode(dwFlags, &dwTimeout);
if( hr == DD_OK )
{
if( pDDSPrimary )
{
// Clear the screen, and display the timeout value
UpdatePrimarySurface( pDDSPrimary, dwTimeout );
}
}
else if( hr == DDERR_NEWMODE )
{
// Cleanup the last DirectDraw surface, and create
// a new one for the new mode
SAFE_RELEASE( pDDSPrimary );
if( FAILED( SetupPrimarySurface( pDD, &pDDSPrimary ) ) )
return hr;
dwFlags = 0;
}
else if( hr == DDERR_TESTFINISHED )
{
// Test complete, so stop looping
break;
}
Sleep( 100 );
}
}
// Cleanup
SAFE_RELEASE( pDDSPrimary );
return S_OK;
}